package com.cn.wanxi.util;

public class MyHelp {
    /**
     * 1.mysql下载
     * 2.注意：如果安装错误需要卸载 时，删除注册表
     * 3.数据模型
     *      1）概念数据模型   用户 界面    用例图
     *      2）逻辑数据模型    数据库
     *      3）物理数据模型    java-model
     * 4.用例图--UML建模工具   powerdesinger（推荐）    rose   九张图
     * 5.常用的图--用例图  类图 时序图  逻辑图
     * 6.用例图
     *      1）参与者
     *      2）用例
     *      3）容器
     *      4）关系
     *
     * 7.类与类之间的关系
     *  基类，原始类，父类，子类
     *      1）泛化关系--继承，实现
     *          必须由一个父类 ：是一个抽象类，公共类（有共同的属性和方法）
     *      2）依赖关系
     *        private UserModel userModel;
     *        UserServlet userServlet=new UserServlet(userModel);
     *        只要在当前类有其他引用类型可以作为参数传递的就可以叫做依赖关系
     *      3）关联关系
     *          老师，学生 ，课程     老师和学生是关联关系
     *          用户 ，角色，权限     用户和角色是关联关系
     *      4）聚合关系
     *          可分割    汽车与零件    电脑 与零件
     *      5）组合关系
     *          不可分割   人月四肢    强聚合关系
     * 8.流程图
     * 9.类图
     * 10.时序图
     * 11.逻辑数据模型
     *    1）创建数据库 CREATE SCHEMA `canyin` ;CREATE database `canyin` ;
     *    2）选择数据库use canyin;
     *    3）创建表
     *       默认InnoDB数据存储引擎show engines;
     *       三大范式：
     *       1）最小拆分  原子性
     *       2）依赖主键   关系不大的应该拆分表
     *       3）必须满足第一第二范式  所有属性不能有其他表里面的列 不要外键
     *       五大约束：
     *       1.主键约束（Primay Key Coustraint） 唯一性，非空性；
     *       2.唯一约束 （Unique Counstraint）唯一性，可以空，但只能有一个；用户账号 身份证
     *       3.默认约束 (Default Counstraint) 该数据的默认值；不能有null出现
     *       4.外键约束 (Foreign Key Counstraint) 需要建立两表间的关系；hibernate 关系映射
     *       5.非空约束（Not Null Counstraint）:设置非空约束，该字段不能为空。
     * 12.创建表：
     *    注册用户表： user：
     *    CREATE TABLE `user` (
     *   `id` INT NOT NULL AUTO_INCREMENT,
     *   `username` VARCHAR(45) NULL,
     *   `password` VARCHAR(45) NULL,
     *   `age` TINYINT(4) NULL,
     *   `weight` TINYINT(4) NULL,
     *   `birthday` DATETIME NULL COMMENT '生日',
     *   PRIMARY KEY (`id`))
     * COMMENT = '用户表';
     *              1.首先根据概念数据模型参考列名
     *               用户需要输入的信息？
     *               账号  username
     *               密码   password
     *               性别   sex
     *               年龄  age
     *               生日  birthday
     *               2.根据逻辑数据模型
     *               公共部分：id，创建时间create_time，update_time,状态enable，备注 remark
     *               以后删除的时候
     *               逻辑删除  指删除后如果添加数据，id是接着以前的id自增  以前的所有数据占据的空间一直存在
     *               delete
     *               物理删除   如果重新添加数据，那么以前的id没有了，无法恢复。
     *               truncate   清空表数据
     *               drop   删除表
     *               注意：这三个删除的区别？
     *               3.注意数据类型
     *               int   整型   tinyint ----  short    bigint ---- long
     *               VARCHAR(45)  字符串   和char（45）的关系？  六万多,如果大约六万多用什么类型？
     *               text 文本  和string大小一样
     *               tinyint（4）   大小默认为4   0-255
     *               tinyint（1）  布尔值  0  假 非0表示真   状态：-
     *               DATETIME   date_format("2020-11-11 00:00:99"  , '%Y-%m-%d')
     *               DECIMAL(5,3)  小数  5代表有几个有效数字  3代表有几为小数
     *
     *               表删除：DROP TABLE `canyin`.`user`;
     *               表修改：ALTER TABLE `canyin`.`user`
     *                          CHANGE COLUMN `weight` `weight` VARCHAR(3) NULL DEFAULT NULL ;
     *                表查询：show  table；
     *
     * 13：表内容操作
     *     增加INSERT INTO `user` (`username`, `password`, `age`, `ight`, `birthday`) VALUES ('aa', 'bb', '1', '2', '2121-11-11');
     *     修改
     * UPDATE `user`
     * SET
     * `username` = 'aaaaaa',
     * `password` = 'bbbbb',
     *  `age` = '3',
     *  `ight` = '23',
     *  `birthday` = '2121-11-11 10:01:00'
     *  WHERE (`id` = '1');
     *
     *
     *   show variables like 'SQL_SAFE_UPDATES';
     *  SET SQL_SAFE_UPDATES = 0;
     *  where条件可以不是主键，必须更改安全配置
     *
     *     删除  delete  from  user  where  id=1
     *     查询
     *
     * &和&&之间的区别？
     * b1& b2  位运算符
     * b1&&b2   短路与   只要有一个为false 就位false
     * 模糊查询
     *SELECT * FROM canyin04.product
     * where  name like '[^张蔡旺]鑫_%';
     * 排序
     * SELECT * FROM canyin04.product
     * order by name
     * asc 升序排列
     * desc  降序排列
     * 分组group by
     * select * from canyin04.product
     * where is_show in
     * (
     * SELECT is_show FROM canyin04.product
     * group by is_show
     * )
     * limit分页公式：curPage是当前第几页；pageSize是一页多少条记录
     *
     * limit  (curPage-1)*pageSize,pageSize   这里  第一个参数是开始位置 ，从0开始数  第二个参数往后面数几条
     * 注意：第一个参数不能为表达式
     * 查询总条数
     *select count(*) from product
     * select count(id) from product
     * select count(1) from product
     * select count(normal_price) from product
     *  count只计算不为null
     *  count列名尽量用* 或者主键
     *
     *    select * from product where id=
     *   (
     *    select max(id) from product
     *   where  id<4)
     *   union all
     *   (select * from product
     *   where id=4 )
     *   union all
     *    select * from product where id=
     *   (
     *    select min(id) from product
     *   where  id>4)
     *   inner join-------------------------------------------
     *    select * from product p
     *  inner join cuisine  c
     *  on p.cuisine_id=c.id
     *
     *  left join
     *   a表  b表
     *   以a表的列为基准  如果b表没有数据，则以null填充
     *   right join
     *       a表  b表
     *       以b表的列为基准  如果a表没有数据，则以null填充
     *
     *       书写顺序
     *       select -->from-->where -->group by-->having-->order by -->limit
     *
     *
     */
    /**
     * 2021-3-12
     * 两个页面：上下左右居中
     * 1.js  数据类型
     * 2.取值赋值  百度
     * 3.前后端以后通过对象传值
     *    js对象  json对象
     */
    /**
     * 2021-3-15
     * 1.前端传递到后台需要json格式
     * 2.正则表达式的用法
     * 3.前端注册按钮点击之前需要再次判断用户输入是否正确
     * 4.前端js的封装
     * 5.后台接受前端的数据   req.getParameter("username");
     * 6.封装接收的数据
     * 7.调用数据逻辑层
     * 8.接受返回数据
     * 9.返回到页面的数据格式--报错--注意：前后台统一用json格式
     * 10.数据逻辑层---梳理逻辑关系  先判断是否已经注册--在进行注册操作
     * 11.尽量少写if else 嵌套
     */
    /**
     * 2021-3-16
     * 1.JDBC封装  单例模式
     * 2.后台代码首先需要对每一张表进行增删改查操作  五个固定的方法
     *      model-dao-service-servlet
     * 3.关闭JDBC连接 注意try catch分开   finally的用法？面试题？
     * 4.final和finally和finalize的区别?
     */
    /**
     * 2021-3-17
     * 1.xadmin 用法
     * 2.验证码
     * 3.查询所有
     * 4.矢量图标
     *
     */
    /**
     * 2021-3-18
     * 1.乱码处理
     * 2.编辑的跳转 ---要将id传到另一个页面
     * 3.根据id查询数据，并将数据赋值到页面
     * 4.校验---一种是用自带的，一种是覆盖
     * 5.提交按钮
     *       data.hobby = getHobby().toLocaleString();
     *       data.id = sessionStorage.getItem("userId");
     *        // 可以对父窗口进行刷新
     *       xadmin.father_reload();
     * 6.后台代码的编写--
     *      servlet里面多了id
     *      mysql里面需要判断 是否符合数据库的类型 create_time，sex
     * 7.JDBC 少了时区
     *
     *
     */
    /**
     * 2021-3-19
     * 模糊查询
     * 1.html代码编写需要查询的表单
     * 2.在servlet里面去封装需要的值
     * 3.在sql语句里面添加where条件
     * 4.注意问题：null和空的判断
     * 5.可以在js里面提前将数据封装到一个对象
     * 6.find_in_set
     * 修改状态：
     * 1.修改html代码(data[i].enable == 1 ? '已启用' : '已停用')
     * 2.修改title="' + (data[i].enable == 1 ? "停用" : "启用") + '"
     * 3.写js，单独修改状态的js，后台也需要单独写
     * function updateEnable(id) {
     *         $.ajax({
     *             url: '/back/user/enable',
     *             data: {id: id},
     *             type: 'post',
     *             dataType: 'json',
     *             success: function (data) {
     *                 findAll();
     *             }
     *         })
     *     }
     * 4.写servlet  --- dao
     *     sql语句：注意的地方：以后新增语句的时候不能有null空，需要默认值
     *     第一：
     *     String sql = "update user " +
     *                 " set " +
     *                 " enable  = abs(enable-1) " +
     *                 " where id=" + userModel.getId();
     *第二：
     *     update user
     * set
     * enable  =CASE enable
     * WHEN 1 THEN 0
     * WHEN (enable!=1) THEN 1
     *
     * END
     * where id=4;
     * 第三：
     * if(1,0,1)
     */
    /**
     * 2021-3-22
     * 分页
     * limit分页公式：curPage是当前第几页；pageSize是一页多少条记录
     * limit  (curPage-1)*pageSize,pageSize
     * （2）用的地方：sql语句中
     * select * from student limit(curPage-1)*pageSize,pageSize;
     * 总条数：SELECT COUNT(*) FROM tablename
     *
     * 修改后台代码
     * 1.修改sql语句
     * 2.增加一个分页的model
     * 3.修改servlet
     * 前端代码修改：
     * 1.查询所有的时候增加分页
     * 2.页面加载完成时，增加分页的方法
     *              sessionStorage.setItem("totalCount", data.totalCount);
     *             setData(data.list);
     *             setPage();
     *   注意： var laypage, layer;应该提取出来，不然得不到里面的值
     */
    /**
     * 2021-3-24
     * 文件上传
     * 1.下载包commons-fileupload-1.4.jar，commons-io-2.6.jar
     * 2.利用ajax上传文件
     *      1）formData
     *          var file = $("#imgHref")[0].files[0];
     *          fd.append("imgHref", file);
     *      2） processData: false,
     *          contentType: false,
     *      3）if (data.result == 'success') {
     *                     layer.msg('新增成功');
     *                     xadmin.close();
     *
     *                     // 可以对父窗口进行刷新
     *                     xadmin.father_reload();
     *                 } else {
     *                     layer.msg('新增失败');
     *                 }
     *
     * 3.后台代码
     *      1）编写servlet  因为所有的文件上传都是属于公共方法，所以提取公共类
     *      2）在upload里面去拿到所有的数据，并保存到req里面
     *      3）在servlet通过req取值
     *      4）和普通方法一样进行增改操作
     *      5)如果想要刷新页面时，显示图片，必须将刚刚保存的图片赋值一份到out文件里面
     *
     */

    /**
     * 2021-3-25
     * 富文本
     * 1.登录官方网站，查看实例文档
     * 2.下载js  wangEditor.min.js
     * 3.查看代码编写
     * 注意：div 和js的书写顺序  js一定在div之后
     * 富文本创建成功
     * 4.配置富文本
     *      1.配置后台访问地址 const editUrl = '/upload-img';//服务器访问地址
     *      2.配置标题   editor.customConfig.menus
     *      3.配置图片保存格式 editor.customConfig.uploadImgShowBase64
     *      4.隐藏网络图片  editor.customConfig.showLinkImg  网络图片地址不一定一致正常运行
     *      5.配置key值  editor.customConfig.uploadFileName
     *      6.跨域配置 editor.config.withCredentials = true
     *      7.配置图片大小  editor.customConfig.uploadImgMaxSize = 5 * 1024 * 1024;
     *      8.配置回调函数   注意： let url = result.url;  result为json格式
     * 5.测试富文本是否正常
     */

/**
 * 2021-3-26
 * session认证
 * 1.前端：每一个页面都需要判断是否已经登录
 *      1）页面加载完成时需要判断
 *      2）用户登录的时候需要给定一个标识符，证明已经登录，一般将标识符存入session
 *      3）每个页面都需要加载当前的js文件
 *      4）因为每一个页面都会访问后台代码，而且都是通过ajax访问，所以，提取黎公共的ajax
 * 2.后端同样需要判断是否已经登录：因为担心坏人直接通过接口操作
 *      1）新建一个MyFilter，实现Filter类
 *      2）首先判断哪些路径是否需要过滤
 *      3）如果需要过滤，就需要判断是否已经登录
 *      4）在登录成功以后需要将成功的标识符存入session
 *      5）对于文件的操作不需要进入过滤器，因为进入后会得不到数据，所以需要对文件进行单独判断
 * 3.每一次得到结果都需要判断后台是否返回的是notLogin，所以直接在x-common.js去判断是否已经登录
 */

/**
 * 2021-4-1
 * redis
 * 1.下载安装文件
 * 2.下载jar包
 * 3.熟悉数据类型
 * 4.crud操作
 * 5.当数据进行修改后需要删除key值，以保证每次刷新页面都为最新数据
 * String  list   set
 *   String  Object
 */
/**
 * 2021-4-6
 * 线程
 * 1.线程的实现方式
 * 2.线程的命名
 * 3.线程的启动  start
 * 4.线程的取得 Thread.currentThread()
 * 5.锁对象时 ，可以是lei.class  可以是this ，可以直接是一个字符串
 *
 */
}

